import {app, BrowserWindow, dialog, Menu, Tray,ipcMain} from "electron";
// import path from "path";
const path = require("path")
import fs from 'fs'

// 这些设置适合开发环境，生产环境下建议保持安全策略。
process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true"; // 忽略Electron的警告
app.commandLine.appendSwitch("disable-web-security"); // 禁用同源策略，允许跨域请求
app.commandLine.appendSwitch("disable-features", "OutOfBlinkCors"); // 允许跨域
app.commandLine.appendSwitch("--ignore-certificate-errors", "true"); // 忽略证书相关错误

let mainWindow: BrowserWindow | null = null;
let tray: Tray | null = null;

const createWindow = async () => {
    // 移除默认菜单
    Menu.setApplicationMenu(null);
    mainWindow = new BrowserWindow({
        title: "XX公司",
        width: 1000,
        height: 800,
        icon: path.join(__dirname, '../public/logo.ico'),
        webPreferences: {
            webSecurity: false, // 禁用网页安全设置，允许跨域
            nodeIntegration: true, // 允许渲染进程使用 Node.js 模块
            contextIsolation: true, // 启用上下文隔离（提高安全性）
            webviewTag: true, // 允许使用 <webview> 标签
            preload: path.join(__dirname, "preload.js"), // 指定预加载脚本的路径
        },
    });
    if (process.env.VITE_DEV_SERVER_URL) {
        await mainWindow.loadURL(process.env.VITE_DEV_SERVER_URL);
        // DevTools 开发环境调试打开
        mainWindow.webContents.openDevTools();
    } else {
        await mainWindow.loadFile(path.join(__dirname, "../dist/index.html"));
    }

    // 当窗口关闭时触发
    mainWindow.on("close", (event) => {
        if (!mainWindow) return;
        // 拦截关闭事件
        event.preventDefault();
        // 弹出对话框，提示用户选择
        const choice = dialog.showMessageBoxSync(mainWindow, {
            type: "question",
            buttons: ["最小化到托盘", "直接退出"],
            defaultId: 0,
            cancelId: 1,
            title: "提示",
            message: "您是要最小化到托盘还是直接退出应用？",
        });
        if (choice === 0) {
            mainWindow.hide(); // 最小化到托盘
            mainWindow.setSkipTaskbar(true); // 从任务栏中隐藏
        } else {
            app.exit(); // 直接退出应用
        }
    });
};

// 应用初始化完成后调用 createWindow 创建窗口
app.whenReady().then(() => {
    createWindow().then();
    createTray();
    app.on("activate", () => {
        if (BrowserWindow.getAllWindows().length === 0) createWindow().then();
    });
});

// 监听保存文件的 IPC 事件
ipcMain.handle('save-file', async (event, filename: string, content: string): Promise<string> => {
    // 让用户选择目录
    const directoryDialogResult = await dialog.showOpenDialog({
        properties: ['openDirectory'], // 只允许选择目录
    });
    if (directoryDialogResult.canceled || directoryDialogResult.filePaths.length === 0) {
        return ''; // 用户取消了操作或没有选择目录
    }
    const directoryPath = directoryDialogResult.filePaths[0];  // 获取用户选择的目录
    // 生成默认的文件路径，保持文件名不变
    const filePath = path.join(directoryPath, filename);

    try {
        // 写入文件
        fs.writeFileSync(filePath, content, 'utf8');
    } catch (error) {
        console.error('文件保存失败:', error);
        throw new Error('文件保存失败');
    }
    return filePath;  // 返回文件路径
});

// 当所有窗口关闭后退出程序
app.on("window-all-closed", () => {
    app.exit();
});

// 全局错误监听器来捕获错误
process.on('uncaughtException', (error) => {
    console.error('未捕获的异常:', error);
});
process.on('unhandledRejection', (reason, promise) => {
    console.error('未处理的 Promise 异常:', reason);
});

function createTray() {
    tray = new Tray(path.join(__dirname, "../public/logo.ico")); // 替换为你的托盘图标路径
    const contextMenu = Menu.buildFromTemplate([
        {
            label: "显示窗口",
            click: () => {
                mainWindow?.show();
            },
        },
        {
            label: "退出应用",
            click: () => {
                app.exit();
            },
        },
    ]);

    tray.setToolTip("XXX公司");
    tray.setContextMenu(contextMenu);

    // 单击托盘图标显示窗口
    tray.on("click", () => {
        mainWindow?.show();
    });
}
  
  
  
  